home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / code_printer.e < prev    next >
Text File  |  2000-03-25  |  7KB  |  276 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. deferred class CODE_PRINTER
  17.    --
  18.    -- Common root for C_PRETTY_PRINTER and JVM.
  19.    --
  20.  
  21. inherit GLOBALS;
  22.  
  23. feature
  24.  
  25.    incr_static_expression_count is
  26.       do
  27.          static_expression_count := static_expression_count + 1;
  28.       end;
  29.  
  30. feature {NONE}
  31.  
  32.    inlined_procedure_count: INTEGER;
  33.  
  34.    inlined_function_count: INTEGER;
  35.  
  36.    procedure_count: INTEGER;
  37.  
  38.    function_count: INTEGER;
  39.  
  40.    precursor_routine_count: INTEGER;
  41.  
  42.    real_procedure_count: INTEGER;
  43.  
  44.    real_function_count: INTEGER;
  45.  
  46.    static_expression_count: INTEGER;
  47.  
  48. feature {RUN_FEATURE_3}
  49.  
  50.    incr_inlined_procedure_count is
  51.       do
  52.          inlined_procedure_count := inlined_procedure_count + 1;
  53.       end;
  54.  
  55.    incr_real_procedure_count is
  56.       do
  57.          real_procedure_count := real_procedure_count + 1;
  58.       end;
  59.  
  60.    incr_procedure_count is
  61.       do
  62.          procedure_count := procedure_count + 1;
  63.       end;
  64.  
  65. feature {RUN_FEATURE_4}
  66.  
  67.    incr_inlined_function_count is
  68.       do
  69.          inlined_function_count := inlined_function_count + 1;
  70.       end;
  71.  
  72.    incr_real_function_count is
  73.       do
  74.          real_function_count := real_function_count + 1;
  75.       end;
  76.  
  77.    incr_function_count is
  78.       do
  79.          function_count := function_count + 1;
  80.       end;
  81.  
  82. feature {RUN_FEATURE_10, RUN_FEATURE_11}
  83.  
  84.    incr_precursor_routine_count is
  85.       do
  86.          precursor_routine_count := precursor_routine_count + 1;
  87.       end;
  88.  
  89. feature {NONE} -- Context stacks :
  90.  
  91.    top: INTEGER;
  92.          -- Index for top of followings stacks.
  93.  
  94.    stack_code: FIXED_ARRAY[INTEGER] is
  95.          -- The indicating stack. It contains only one
  96.          -- of the following unique code.
  97.       once
  98.          !!Result.make(stack_first_size);
  99.       end;
  100.  
  101.    C_direct_call: INTEGER is unique;
  102.          -- Target is sure not to be Void and there is only one possible
  103.          -- type (target is often Current, a manifest string or an expanded).
  104.  
  105.    C_check_id: INTEGER is unique;
  106.          -- Target is a reference type which can be Void but only one type
  107.          -- is the good one.
  108.  
  109.    C_switch: INTEGER is unique;
  110.          -- Target is a reference type with more than one possibility.
  111.  
  112.    C_inside_new: INTEGER is unique;
  113.          -- Target has been just created inside a creation call and
  114.          -- need some initializing procedure call.
  115.  
  116.    C_expanded_initialize: INTEGER is unique;
  117.          -- Target is some expanded to initialize.
  118.  
  119.    C_inline_dca: INTEGER is unique;
  120.          -- Inlining of a direct call applied on attribute of target.
  121.          -- Target is the one given at `top-1' plus the access to
  122.          -- the corresponding attribute stored at level `top'.
  123.          -- Arguments are taken at `top-1' context.
  124.  
  125.    C_same_target: INTEGER is unique;
  126.          -- Target is stored at level top - 1;
  127.  
  128.    C_inline_one_pc: INTEGER is unique;
  129.          -- Inlining `one_pc' of RUN_FEATURE_3;
  130.  
  131.    C_inside_twin: INTEGER is unique;
  132.          -- In order to call the user's `copy'.
  133.  
  134.    C_precursor: INTEGER is unique;
  135.          -- For Precursor calls.
  136.  
  137.    -- Contents of stacks depends on `stack_code'.
  138.    stack_rf: FIXED_ARRAY[RUN_FEATURE] is
  139.       once
  140.          !!Result.make(stack_first_size);
  141.       end;
  142.  
  143.    stack_target: FIXED_ARRAY[EXPRESSION] is
  144.       once
  145.          !!Result.make(stack_first_size);
  146.       end;
  147.  
  148.    stack_args: FIXED_ARRAY[EFFECTIVE_ARG_LIST] is
  149.       once
  150.          !!Result.make(stack_first_size);
  151.       end;
  152.  
  153.    stack_static_rf: FIXED_ARRAY[RUN_FEATURE] is
  154.       once
  155.          !!Result.make(stack_first_size);
  156.       end;
  157.  
  158.    stack_cpc: FIXED_ARRAY[CALL_PROC_CALL] is
  159.       once
  160.          !!Result.make(stack_first_size);
  161.       end;
  162.  
  163.    stack_first_size: INTEGER is 12;
  164.  
  165.    stack_push(code: INTEGER) is
  166.          -- Push the `code' and resize all stacks if needed.
  167.       local
  168.          new_size: INTEGER;
  169.       do
  170.          top := top + 1;
  171.          if top > stack_code.upper then
  172.             new_size := stack_code.upper * 2;
  173.             stack_code.resize(new_size);
  174.             stack_rf.resize(new_size);
  175.             stack_target.resize(new_size);
  176.             stack_args.resize(new_size);
  177.             stack_static_rf.resize(new_size);
  178.             stack_cpc.resize(new_size);
  179.             if new_size > 1024 then
  180.                stack_overflow
  181.             end;
  182.          end;
  183.          stack_code.put(code,top);
  184.       end;
  185.  
  186. feature {E_PRECURSOR}
  187.  
  188.    push_precursor(rf: RUN_FEATURE; args: EFFECTIVE_ARG_LIST) is
  189.       require
  190.          rf /= Void;
  191.       do
  192.          stack_push(C_precursor);
  193.          stack_rf.put(rf,top);
  194.          stack_args.put(args,top);
  195.          direct_call_count := direct_call_count + 1;
  196.       end;
  197.  
  198. feature {RUN_FEATURE_3}
  199.  
  200.    stack_not_full: BOOLEAN is
  201.       do
  202.          Result := top < 50;
  203.       end;
  204.  
  205. feature {NONE}
  206.  
  207.    stack_overflow is
  208.       local
  209.          i: INTEGER;
  210.          rf: RUN_FEATURE;
  211.          rtm: STRING;
  212.          rtma: FIXED_ARRAY[STRING];
  213.       do
  214.          eh.append("Infinite inlining loop (bad recursion ??). ");
  215.          from
  216.             i := top - 1;
  217.          until
  218.             i < stack_code.lower
  219.          loop
  220.             rf := stack_rf.item(i);
  221.             if rf /= Void then
  222.                eh.add_position(rf.start_position);
  223.                rtm := rf.current_type.run_time_mark;
  224.                if rtma = Void then
  225.                   !!rtma.with_capacity(top);
  226.                   rtma.add_last(rtm);
  227.                   eh.append(rtm);
  228.                elseif rtma.fast_has(rtm) then
  229.                else
  230.                   rtma.add_last(rtm);
  231.                   eh.append(", ");
  232.                   eh.append(rtm);
  233.                end;
  234.             end;
  235.             i := i - 1;
  236.          end;
  237.          fatal_error(",...");
  238.       end;
  239.  
  240. feature
  241.  
  242.    pop is
  243.       do
  244.          check
  245.             stack_code.lower <= top;
  246.          end;
  247.          top := top - 1;
  248.       ensure
  249.          old(top) = top + 1
  250.       end;
  251.  
  252. feature {NONE}
  253.  
  254.    check_id_count: INTEGER;
  255.  
  256.    direct_call_count: INTEGER;
  257.  
  258.    sure_void_count: INTEGER;
  259.  
  260.    switch_count: INTEGER;
  261.  
  262. feature {GC_HANDLER}
  263.  
  264.    incr_direct_call_count is
  265.       do
  266.          direct_call_count := direct_call_count + 1;
  267.       end;
  268.  
  269.    incr_switch_count is
  270.       do
  271.          switch_count := switch_count + 1;
  272.       end;
  273.  
  274. end -- CODE_PRINTER
  275.  
  276.